#include "pacture.h"
#include "ui_pacture.h"
#include <QVBoxLayout>
#include <QImage>
#include <QDebug>
#include <QThread>

#include "globalval.h"
#include "mqtthandler.h"

pacture::pacture(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::pacture)
{
    ui->setupUi(this);

    // 设置对话框的标题
    setWindowTitle("Video Stream Client");
    // 创建 UDP 套接字对象，并指定父对象为当前对话框，方便自动清理内存
    udpSocket = new QUdpSocket(this);
    timer = new QTimer(this);

    connect(timer, &QTimer::timeout, this, &pacture::sendRequest);
    // 连接发送按钮的 clicked 信号到 sendRequest 槽函数，当按钮被点击时触发
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(sendRequest()));

    // 连接 UDP 套接字的 readyRead 信号到 processDatagrams 槽函数，当有数据可读时触发
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processDatagrams()));

    // 连接截图按钮的点击信号到 takeScreenshot 槽函数
    connect(ui->pushButton_scr, SIGNAL(clicked()), this, SLOT(takeScreenshot()));

    // 连接保存按钮的点击信号到 saveScreenshot 槽函数
    connect(ui->pushButton_save, SIGNAL(clicked()), this, SLOT(saveScreenshot()));

//    connect(ui->pushButton_on, SIGNAL(clicked()), this, SLOT(showPreviousScreenshot()));
//    connect(ui->pushButton_down, SIGNAL(clicked()), this, SLOT(showNextScreenshot()));

}

pacture::~pacture()
{
    delete ui;
}

// 发送请求的槽函数
void pacture::sendRequest()
{
    timer->start(1);
    // 获取文本输入框中的内容
    QString request = ui->lineEdit->text();
    // 如果输入的内容是 "get_stream"
    if (request == "get_stream") {
        // 将请求转换为 UTF-8 编码的字节数组
        QByteArray data = request.toUtf8();
        // 向指定的 IP 地址和端口发送数据报
         udpSocket->writeDatagram(data, QHostAddress(GlobalVal::videoAddr), GlobalVal::videoPort);

    } else {
        // 如果输入的内容不是 "get_stream"，输出错误信息
        qDebug() << "Invalid request.";
    }
}

// 处理接收到的数据报的槽函数
void pacture::processDatagrams()
{
    // 循环处理所有待处理的数据报
    while (udpSocket->hasPendingDatagrams()) {
        // 创建一个字节数组用于存储接收到的数据
        QByteArray datagram;
        // 设置字节数组的大小为当前待处理数据报的大小
        datagram.resize(udpSocket->pendingDatagramSize());
        // 创建一个地址对象用于存储发送方的地址
        QHostAddress sender;
        // 创建一个无符号短整型变量用于存储发送方的端口号
        quint16 senderPort;
        // 从 UDP 套接字读取数据报，将数据存储到字节数组中，并获取发送方地址和端口号
        udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);

        // 尝试从接收到的字节数组创建 QImage 对象，如果成功则说明接收到的是图像数据
        QImage image = QImage::fromData(datagram);
        if (!image.isNull()) {
            // 将图像设置为视频标签的像素图，以显示图像
            ui->label->setPixmap(QPixmap::fromImage(image));
        }
    }
}

// 截图槽函数实现
void pacture::takeScreenshot()
{
    // 抓取视频流标签的内容作为图像
    screenshot = ui->label->grab().toImage();

    // 将抓取到的图像设置为截图预览标签的图像
    ui->label_scr->setPixmap(QPixmap::fromImage(screenshot));


}
// 保存槽函数实现
void pacture::saveScreenshot()
{
    // 弹出文件对话框让用户选择保存路径
    QString savePath = QFileDialog::getExistingDirectory(this, "选择保存路径");

    // 如果用户选择了有效的保存路径
    if (!savePath.isEmpty())
    {
        // 获取当前时间
        QDateTime currentTime = QDateTime::currentDateTime();

        // 构建保存的文件名，格式为：路径/年-月-日_时-分-秒.png
        QString fileName = savePath + "/" + currentTime.toString("yyyy.MM.dd_hh.mm.ss") + ".png";

        // 将截图保存为 PNG 格式的图片

        screenshot.save(fileName, "PNG");
        //screenshotAlbum[currentIndex].save(fileName, "PNG");
        // 在调试输出中显示保存成功的信息
        qDebug() << "截图保存成功：" << fileName;
    }
    else
    {
        // 如果用户未选择保存路径，在调试输出中显示未保存的信息
        qDebug() << "未选择保存路径，截图未保存。";
    }


}

//void pacture::showPreviousScreenshot()
//{
//    // 如果截图相册中有截图且当前索引大于 0（不是第一张截图）
//       if (screenshotAlbum.size() > 0 && currentIndex > 0)
//       {
//           // 当前索引减一，显示上一张截图
//           currentIndex--;

//           // 将上一张截图设置为截图预览标签的图像
//           ui->label_scr->setPixmap(QPixmap::fromImage(screenshotAlbum[currentIndex]));
//       }
//}

//void pacture::showNextScreenshot()
//{
//    // 如果截图相册中有截图且当前索引小于相册中最后一张截图的索引
//       if (screenshotAlbum.size() > 0 && currentIndex < screenshotAlbum.size() - 1)
//       {
//           // 当前索引加一，显示下一张截图
//           currentIndex++;

//           // 将下一张截图设置为截图预览标签的图像
//           ui->label_scr->setPixmap(QPixmap::fromImage(screenshotAlbum[currentIndex]));
//       }

//}
